; generated by Component: ARM Compiler 5.06 update 5 (build 528) Tool: ArmCC [4d3621]
; commandline ArmCC [--list --debug -c --asm --interleave -o.\obj\timer.o --asm_dir=.\Obj\ --list_dir=.\Obj\ --depend=.\obj\timer.d --cpu=Cortex-M3 --apcs=interwork -O3 --diag_suppress=9931 -I. -I.\Core_CM3 -IC:\Keil\ARM\RV31\INC -IC:\Keil\ARM\CMSIS\Include -IC:\Keil\ARM\INC\NXP -D__UVISION_VERSION=524 --omf_browse=.\obj\timer.crf timer\timer.c]
                          THUMB

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  Timer_init PROC
;;;21     // initialize timer 0 to count milliseconds
;;;22     void Timer_init(void) {
000000  4821              LDR      r0,|L1.136|
;;;23       // timer 0 clocked with CCLK/1
;;;24       LPC_SC->PCLKSEL0 &= (0x3UL << 2);
000002  f8d011a8          LDR      r1,[r0,#0x1a8]
000006  f001010c          AND      r1,r1,#0xc
00000a  f8c011a8          STR      r1,[r0,#0x1a8]
;;;25       LPC_SC->PCLKSEL0 |= (0x1UL << 2);
00000e  f8d011a8          LDR      r1,[r0,#0x1a8]
000012  f0410104          ORR      r1,r1,#4
000016  f8c011a8          STR      r1,[r0,#0x1a8]
;;;26     
;;;27       // use timer 0 as timer (pclk = 64MHz)
;;;28       LPC_TIM0->CTCR = 0x00;
00001a  f04f2040          MOV      r0,#0x40004000
00001e  2100              MOVS     r1,#0
000020  6701              STR      r1,[r0,#0x70]
;;;29       // prescaler - count at 1kHz
;;;30       LPC_TIM0->PR = 64000-1;
000022  f64f12ff          MOV      r2,#0xf9ff
000026  60c2              STR      r2,[r0,#0xc]
;;;31       // no matches or interrupts
;;;32       LPC_TIM0->MCR = 0x0000;
000028  6141              STR      r1,[r0,#0x14]
;;;33       // enable
;;;34       LPC_TIM0->TCR = 0x01;
00002a  2101              MOVS     r1,#1
00002c  6041              STR      r1,[r0,#4]
;;;35     }
00002e  4770              BX       lr
;;;36     
                          ENDP

                  Timer_DeInit PROC
;;;39     // the state of the registers
;;;40     void Timer_DeInit(void) {
000030  f04f2040          MOV      r0,#0x40004000
;;;41       // disable
;;;42       LPC_TIM0->TCR  = 0x00;
000034  2100              MOVS     r1,#0
000036  6041              STR      r1,[r0,#4]
;;;43       LPC_TIM0->CTCR = 0x00;
000038  6701              STR      r1,[r0,#0x70]
;;;44       LPC_TIM0->PR   = 0;
00003a  60c1              STR      r1,[r0,#0xc]
;;;45       LPC_TIM0->MCR  = 0x0000;
00003c  6141              STR      r1,[r0,#0x14]
;;;46       LPC_TIM0->TC   = 0;
00003e  6081              STR      r1,[r0,#8]
;;;47       LPC_TIM0->PC   = 0;
000040  6101              STR      r1,[r0,#0x10]
;;;48     }
000042  4770              BX       lr
;;;49     
                          ENDP

                  Timer_GetTimestamp PROC
;;;50     // get the current timer 0 count
;;;51     unsigned long Timer_GetTimestamp(void) {
000044  f04f2040          MOV      r0,#0x40004000
;;;52       return LPC_TIM0->TC;
000048  6880              LDR      r0,[r0,#8]
;;;53     }
00004a  4770              BX       lr
;;;54     
                          ENDP

                  Timer_HasTimestampExpired PROC
;;;56     // returns 1 if in the past, 0 if not
;;;57     int Timer_HasTimestampExpired(unsigned long timestamp) {
00004c  f04f2140          MOV      r1,#0x40004000
;;;58       unsigned long now = LPC_TIM0->TC;
000050  6889              LDR      r1,[r1,#8]
;;;59     
;;;60       if (now > timestamp)
;;;61       {
;;;62         if ((now - timestamp) < 0x80000000)
000052  f04f4200          MOV      r2,#0x80000000
000056  4281              CMP      r1,r0                 ;60
000058  d903              BLS      |L1.98|
00005a  1a08              SUBS     r0,r1,r0
00005c  4290              CMP      r0,r2
00005e  d303              BCC      |L1.104|
000060  e004              B        |L1.108|
                  |L1.98|
;;;63           return 1;
;;;64         else
;;;65           return 0;
;;;66       }
;;;67       else
;;;68       {
;;;69         if ((timestamp - now) >= 0x80000000)
000062  1a40              SUBS     r0,r0,r1
000064  4290              CMP      r0,r2
000066  d301              BCC      |L1.108|
                  |L1.104|
;;;70           return 1;
000068  2001              MOVS     r0,#1
;;;71         else
;;;72           return 0;
;;;73       }
;;;74     }
00006a  4770              BX       lr
                  |L1.108|
00006c  2000              MOVS     r0,#0                 ;72
00006e  4770              BX       lr
;;;75     
                          ENDP

                  Timer_Delay PROC
;;;76     // pause for a specific number of milliseconds
;;;77     void Timer_Delay(unsigned long milliseconds) {
000070  b500              PUSH     {lr}
000072  f04f2140          MOV      r1,#0x40004000
000076  6889              LDR      r1,[r1,#8]
;;;78       unsigned long timestamp = Timer_GetTimestamp() + milliseconds;
000078  180b              ADDS     r3,r1,r0
                  |L1.122|
;;;79       while (!Timer_HasTimestampExpired(timestamp));
00007a  4618              MOV      r0,r3
00007c  f7fffffe          BL       Timer_HasTimestampExpired
000080  2800              CMP      r0,#0
000082  d0fa              BEQ      |L1.122|
;;;80     }
000084  bd00              POP      {pc}
                          ENDP

000086  0000              DCW      0x0000
                  |L1.136|
                          DCD      0x400fc000
